package org.ipower.examsystem.dao.impl;

import java.util.List;
import org.ipower.examsystem.dao.ItemAnswerDao;
import org.ipower.examsystem.dao.ItemAnswerResolveDao;
import org.ipower.examsystem.dao.ItemOptionsDao;
import org.ipower.examsystem.dao.ItemTopicsDao;
import org.ipower.examsystem.dao.ItemTopicsPropertiesDao;
import org.ipower.examsystem.domain.ItemAnswer;
import org.ipower.examsystem.domain.ItemAnswerResolve;
import org.ipower.examsystem.domain.ItemOptions;
import org.ipower.examsystem.domain.ItemTopics;
import org.ipower.examsystem.domain.ItemTopicsProperties;
import org.ipower.examsystem.service.Answer;
import org.ipower.examsystem.service.AnswerResolve;
import org.ipower.examsystem.service.Answers;
import org.ipower.examsystem.service.Option;
import org.ipower.examsystem.service.Options;
import org.ipower.examsystem.service.Topic;
import org.ipower.examsystem.service.TopicProperty;

/**
 * 题干信息数据访问。
 * @author young
 */
public class ItemTopicsDaoImpl extends ModuleGenericDaoImpl<ItemTopics> implements ItemTopicsDao  {
    private ItemTopicsPropertiesDao propertiesDao = null;
    private ItemOptionsDao optionsDao = null;
    private ItemAnswerDao answerDao = null;
    private ItemAnswerResolveDao resolveDao = null;
    /**
     * 设置题干附加数据访问接口。
     * @param dao  附加数据访问接口。
     * */
    @Override
    public void setItemTopicsPropertiesDao(ItemTopicsPropertiesDao dao) {
        this.propertiesDao = dao;
    }
    /**
     * 设置选项数据访问接口。
     * @param dao 选项数据访问接口。
     * */
    @Override
    public void setOptionsDao(ItemOptionsDao dao) {
        this.optionsDao = dao;
    }
    /**
     * 设置答案数据访问接口。
     * @param dao 答案数据访问接口。
     * */
    @Override
    public void setAnswerDao(ItemAnswerDao dao) {
        this.answerDao = dao;
    }
    /**
     * 设置答案解析数据访问接口。
     * @param dao 答案解析数据访问接口。
     * */
    @Override
    public void setAnswerResolveDao(ItemAnswerResolveDao dao) {
        this.resolveDao =dao;
    }
    /**
     * 加载题目数据。
     * @param topicsID 题干ID。
     * */
    @Override
    public Topic loadTopics(String topicsID) {
         if(topicsID != null && !topicsID.isEmpty()){
           ItemTopics topics =  this.load(topicsID);
           if(topics != null){
               Topic data = new Topic();
               data.setTopicsID(topics.getTopicsID());
               data.setContent(topics.getContent());
               data.setImgUri(topics.getImgUri());
               data.setOrderNo(topics.getOrderNo());
               this.addAllProperties(data);
               List<ItemTopics> list = this.loadAll("ParentTopicsID", data.getTopicsID());
               if(list != null && list.size() > 0){
                   for(ItemTopics item : list){
                       this.addChilds(data, item);                       
                   }
               }
               return data;
           }
         }
         return null;
    }
    /**
     * 添加子题目数据。
     * @param parent 父题目。
     * @param item 题目信息。
     * */
    private void addChilds(Topic parent, final ItemTopics item){
        if(parent != null && item != null){
            Topic data = new Topic();
            data.setTopicsID(item.getTopicsID());
            data.setContent(item.getContent());
            data.setImgUri(item.getImgUri());
            data.setOrderNo(item.getOrderNo());
            this.addAllProperties(data);
            List<ItemTopics> list = this.loadAll("ParentTopicsID", data.getTopicsID());
            if(list != null && list.size() > 0){
                for(ItemTopics m : list){
                    this.addChilds(data, m);                       
                }
            }
            parent.getChilds().add(data);
        }
    }
    /**
     * 附加全部数据。
     * @param data 题目信息。
     * */
    private void addAllProperties(Topic data){
        if(data != null && data.getTopicsID() != null && !data.getTopicsID().isEmpty()){
             //附加数据。
               if(this.propertiesDao != null){
                   TopicProperty properties = this.propertiesDao.loadProperties(data.getTopicsID());
                   if(properties != null){
                       data.getProperty().setCatalogID(properties.getCatalogID());
                       data.getProperty().setCheckCode(properties.getCheckCode());
                       data.getProperty().setCreateTime(properties.getCreateTime());
                       data.getProperty().setDifficulty(properties.getDifficulty());
                       data.getProperty().setKeyword(properties.getKeyword());
                       data.getProperty().setSectionID(properties.getSectionID());
                       data.getProperty().setTypeID(properties.getTypeID());
                       data.getProperty().setTypeName(properties.getTypeName());
                   }
               }
               //选项数据。
               if(this.optionsDao != null){
                  Options options =  this.optionsDao.loadOptions(data.getTopicsID());
                  if(options != null && options.size() > 0){
                      data.getOptions().addAll(options);
                  }
               }
               //答案数据。
               if(this.answerDao != null){
                   Answers answers = this.answerDao.loadAnswers(data.getTopicsID());
                   if(answers != null && answers.size() > 0){
                       data.getAnswers().addAll(answers);
                   }
               }
               //答案解析数据。
               if(this.resolveDao != null){
                   AnswerResolve answerResolve = this.resolveDao.loadResolve(data.getTopicsID());
                   if(answerResolve != null){
                       data.getResolve().setResolve(answerResolve.getResolve());
                       data.getResolve().setImgUri(answerResolve.getImgUri());
                   }
               }
        }
    }
    /**
     * 保存题目数据。
     * @param topic 题目对象。
     * */
     @Override
    public void Save(Topic topic) {
       if(topic != null && topic.getTopicsID() != null && !topic.getTopicsID().isEmpty()){
           this.saveTopicData(topic);
           if(topic.getChilds() != null && topic.getChilds().size() > 0){
               for(int i = 0; i < topic.getChilds().size(); i++){
                   this.Save(topic.getChilds().get(i));
               }
           }
       }
    }
     /**
      * 保存题干数据。
      * @param topic 题干实例。
      * */
    private void saveTopicData(Topic topic){
        if(topic != null && topic.getTopicsID() != null && !topic.getTopicsID().isEmpty()){
            boolean isAdd =false;
            ItemTopics item = this.load(topic.getTopicsID());
            if(item == null){
                isAdd = true;
                item = new ItemTopics();
                item.setTopicsID(topic.getTopicsID());
            }
            item.setContent(topic.getContent());
            item.setImgUri(topic.getImgUri());
            item.setOrderNo(topic.getOrderNo());
            if(topic.getParent() != null){
              item.setParentTopicsID(topic.getParent().getTopicsID());
            }
            if(isAdd){
                this.save(item);
            }else{
                this.update(item);
            }
            //附加属性。
            if(topic.getProperty() != null){
                this.savePropertyData(item.getTopicsID(), topic.getProperty());
            }
            //选项。
            if(topic.getOptions() != null && topic.getOptions().size() > 0){
                 //删除答案。
                if(this.answerDao != null){
                    this.answerDao.delete(item.getTopicsID());
                }
                this.saveOptionsData(item.getTopicsID(), topic.getOptions());
            }
            //答案。
            if(topic.getAnswers() != null && topic.getAnswers().size() > 0){
                this.saveAnswerData(item.getTopicsID(), topic.getAnswers());
            }
            //解析。
            if(topic.getResolve() != null){
                this.saveResolve(item.getTopicsID(), topic.getResolve());
            }
        }
    }
    /**
     * 保存附加数据。
     * @param topicsID 题干ID。
     * @param property 附加对象。
     * */
     private void savePropertyData(String topicsID,TopicProperty property){
         if(topicsID != null && !topicsID.isEmpty() && property != null && this.propertiesDao != null){
             boolean isAdd = false;
             ItemTopicsProperties itp = this.propertiesDao.load(topicsID);
             if(itp == null){
                 itp = new ItemTopicsProperties();
                 itp.setTopicsID(topicsID);
                 isAdd = true;
             }
             itp.setCatalogID(property.getCatalogID());
             itp.setCheckCode(property.getCheckCode());
             itp.setCreateTime(property.getCreateTime());
             itp.setDifficulty(property.getDifficulty());
             itp.setKeyword(property.getKeyword());
             itp.setSectionID(property.getSectionID());
             itp.setTypeID(property.getTypeID());
             if(isAdd){
                 this.propertiesDao.save(itp);
             }else{
                 this.propertiesDao.update(itp);
             }
         }
     }
     /**
      * 保存答案数据。
      * @param topicsID 题干ID。
      * @param answers 答案集合。
      * */
     private void saveAnswerData(String topicsID, Answers answers){
         if(this.answerDao != null && topicsID != null && !topicsID.isEmpty() && answers != null && answers.size() > 0){
            this.answerDao.delete(topicsID);
             for(Answer an :  answers){
                 ItemAnswer item = new ItemAnswer();
                 item.setTopicsID(topicsID);
                 item.setOptionID(an.getOptionID());
                 item.setContent(an.getContent());
                 item.setImgUri(an.getImgUri());
                 this.answerDao.save(item);
             }
         }
     }
     /**
      * 保存答案解析。
      * @param topicsID 题干ID。
      * @param resolve 解析实例。
      * */
     private void saveResolve(String topicsID, AnswerResolve resolve){
         if(this.resolveDao != null && topicsID != null && !topicsID.isEmpty() && resolve != null){
             boolean isSave = false;
             ItemAnswerResolve item = this.resolveDao.load(topicsID);
             if(item == null){
                 item = new ItemAnswerResolve();
                 item.setTopicsID(topicsID);
                 isSave = true;
             }
             item.setImgUri(resolve.getImgUri());
             item.setResolve(resolve.getResolve());
             if(isSave){
                 this.resolveDao.save(item);
             }else{
                 this.resolveDao.update(item);
             }
         }
     }
     /**
      * 保存选项数据。
      * @param topicsID 题干ID。
      * @param options 选项集合。
      * */
     private void saveOptionsData(String topicsID, Options options){
         if(topicsID != null && !topicsID.isEmpty() && options != null && options.size() > 0 && this.optionsDao != null){
             Options sourceOptions = this.optionsDao.loadOptions(topicsID);
             for(Option op : options){
                 boolean isAdd = false;
                 ItemOptions item =  this.optionsDao.load(op.getOptionID());
                 if(item == null){
                     item = new ItemOptions();
                     item.setOptionID(op.getOptionID());
                     isAdd = true;
                 }else{
                     sourceOptions.Remove(item.getOptionID());
                 }
                 item.setContent(op.getContent());
                 item.setImgUri(op.getImgUri());
                 item.setOrderNo(op.getOrderNo());
                 item.setTitle(op.getTitle());
                 item.setTopicsID(topicsID); 
                 if(isAdd){
                     this.optionsDao.save(item);
                 }else{
                     this.optionsDao.update(item);
                 }
             }
             if(sourceOptions != null && sourceOptions.size() > 0){
                 for(int i = 0; i < sourceOptions.size(); i++){
                     this.optionsDao.delete(sourceOptions.get(i));
                 }
             }
         }
     }
    /**
     * 删除题干数据。
     * @param topicsID 题干ID。
     * */
    @Override
    public void delete(String topicsID) {
         if(topicsID != null && !topicsID.isEmpty()){
             //递归删除子孙。
             List<ItemTopics> childs = this.loadAll("ParentTopicsID", topicsID);
             if(childs != null && childs.size() > 0){
                 for(int i = 0; i < childs.size(); i++){
                     this.delete(childs.get(i).getTopicsID());
                 }
             }
             //删除附加数据。
             if(this.propertiesDao != null){
                 this.propertiesDao.delete(topicsID);
             }
             //删除答案数据。
             if(this.answerDao != null){
                 this.answerDao.delete(topicsID);
             }
             //删除答案解析数据。
             if(this.resolveDao != null){
                 this.resolveDao.delete(topicsID);
             }
             //删除选项数据。
             if(this.optionsDao != null){
                 this.optionsDao.delete(topicsID);
             }
             //删除本条数据。
             ItemTopics item = this.load(topicsID);
             if(item != null){
                 this.delete(item);
             }
         }
    }
}